home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / WORDPAD.PAK / IPFRAME.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  11KB  |  371 lines

  1. // ipframe.cpp : implementation of the CInPlaceFrame class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1995 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "stdafx.h"
  14. #include "wordpad.h"
  15. #include "formatba.h"
  16. #include "ruler.h"
  17. #include "ipframe.h"
  18. #include "wordpdoc.h"
  19. #include "wordpvw.h"
  20. #include "colorlis.h"
  21.  
  22. #ifdef _DEBUG
  23. #undef THIS_FILE
  24. static char BASED_CODE THIS_FILE[] = __FILE__;
  25. #endif
  26.  
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CInPlaceFrame
  29.  
  30. IMPLEMENT_DYNCREATE(CInPlaceFrame, COleIPFrameWnd)
  31.  
  32. BEGIN_MESSAGE_MAP(CInPlaceFrame, COleIPFrameWnd)
  33.     //{{AFX_MSG_MAP(CInPlaceFrame)
  34.     ON_WM_CREATE()
  35.     ON_WM_DESTROY()
  36.     ON_COMMAND(ID_HELP, OnHelpFinder)
  37.     ON_COMMAND(ID_CHAR_COLOR, OnCharColor)
  38.     ON_COMMAND(ID_HELP_INDEX, OnHelpFinder)
  39.     ON_COMMAND(ID_PEN_TOGGLE, OnPenToggle)
  40.     //}}AFX_MSG_MAP
  41.     ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR, OnUpdateControlBarMenu)
  42.     ON_COMMAND_EX(ID_VIEW_TOOLBAR, OnBarCheck)
  43.     ON_UPDATE_COMMAND_UI(ID_VIEW_FORMATBAR, OnUpdateControlBarMenu)
  44.     ON_COMMAND_EX(ID_VIEW_FORMATBAR, OnBarCheck)
  45.     ON_UPDATE_COMMAND_UI(ID_VIEW_RULER, OnUpdateControlBarMenu)
  46.     ON_COMMAND_EX(ID_VIEW_RULER, OnBarCheck)
  47.     ON_MESSAGE(WM_SIZECHILD, OnResizeChild)
  48.     ON_MESSAGE(WPM_BARSTATE, OnBarState)
  49.     ON_COMMAND(ID_DEFAULT_HELP, OnHelpFinder)
  50. //    ON_COMMAND(ID_CONTEXT_HELP, COleIPFrameWnd::OnContextHelp)
  51. END_MESSAGE_MAP()
  52.  
  53. /////////////////////////////////////////////////////////////////////////////
  54. // arrays of IDs used to initialize control bars
  55.  
  56. static UINT BASED_CODE toolButtons[] =
  57. {
  58.     // same order as in the bitmap 'itoolbar.bmp'
  59.     ID_EDIT_CUT,
  60.     ID_EDIT_COPY,
  61.     ID_EDIT_PASTE,
  62.  
  63.         ID_SEPARATOR,
  64.     ID_PEN_TOGGLE,
  65.     ID_PEN_PERIOD,
  66.     ID_PEN_SPACE,
  67.     ID_PEN_BACKSPACE,
  68.     ID_PEN_NEWLINE,
  69.     ID_PEN_LENS
  70. };
  71.  
  72. #define NUM_PEN_ITEMS 7
  73. #define NUM_PEN_TOGGLE 5
  74.  
  75. static UINT BASED_CODE format[] =
  76. {
  77.     // same order as in the bitmap 'format.bmp'
  78.         ID_SEPARATOR, // font name combo box
  79.         ID_SEPARATOR,
  80.         ID_SEPARATOR, // font size combo box
  81.         ID_SEPARATOR,
  82.     ID_CHAR_BOLD,
  83.     ID_CHAR_ITALIC,
  84.     ID_CHAR_UNDERLINE,
  85.     ID_CHAR_COLOR,
  86.         ID_SEPARATOR,
  87.     ID_PARA_LEFT,
  88.     ID_PARA_CENTER,
  89.     ID_PARA_RIGHT,
  90.         ID_SEPARATOR,
  91.     ID_INSERT_BULLET,
  92. };
  93.  
  94. /////////////////////////////////////////////////////////////////////////////
  95. // CInPlaceFrame construction/destruction
  96.  
  97. CInPlaceFrame::CInPlaceFrame() : m_wndRulerBar(FALSE)
  98. {
  99. }
  100.  
  101. int CInPlaceFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  102. {
  103.     if (COleIPFrameWnd::OnCreate(lpCreateStruct) == -1)
  104.         return -1;
  105.  
  106.     // CResizeBar implements in-place resizing.
  107.     if (!m_wndResizeBar.Create(this))
  108.     {
  109.         TRACE0("Failed to create resize bar\n");
  110.         return -1;      // fail to create
  111.     }
  112.  
  113.     if (!CreateRulerBar(this))
  114.         return FALSE;
  115.  
  116.     // By default, it is a good idea to register a drop-target that does
  117.     //  nothing with your frame window.  This prevents drops from
  118.     //  "falling through" to a container that supports drag-drop.
  119.     m_dropTarget.Register(this);
  120.  
  121.     return 0;
  122. }
  123.  
  124. // OnCreateControlBars is called by the framework to create control bars on the
  125. //  container application's windows.  pWndFrame is the top level frame window of
  126. //  the container and is always non-NULL.  pWndDoc is the doc level frame window
  127. //  and will be NULL when the container is an SDI application.  A server
  128. //  application can place MFC control bars on either window.
  129. BOOL CInPlaceFrame::OnCreateControlBars(CFrameWnd* pWndFrame, CFrameWnd* /*pWndDoc*/)
  130. {
  131.     if (!CreateToolBar(pWndFrame))
  132.         return FALSE;
  133.  
  134.     if (!CreateFormatBar(pWndFrame))
  135.         return FALSE;
  136.  
  137.     // set owner to this window, so messages are delivered to correct app
  138.     m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  139.     m_wndFormatBar.EnableDocking(CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM);
  140.     pWndFrame->EnableDocking(CBRS_ALIGN_ANY);
  141.     pWndFrame->DockControlBar(&m_wndToolBar);
  142.     pWndFrame->DockControlBar(&m_wndFormatBar);
  143.  
  144.     m_wndToolBar.SetOwner(this);
  145.     m_wndFormatBar.SetOwner(this);
  146.     m_wndRulerBar.SetOwner(this);
  147.     OnBarState(1, RD_EMBEDDED); //load bar state
  148.     return TRUE;
  149. }
  150.  
  151. BOOL CInPlaceFrame::CreateToolBar(CWnd* pWndFrame)
  152. {
  153.     // Create toolbar on client's frame window
  154.     ASSERT(m_wndToolBar.m_hWnd == NULL);
  155.     int nPen = GetSystemMetrics(SM_PENWINDOWS) ? NUM_PEN_TOGGLE : 
  156.         NUM_PEN_ITEMS;
  157.     UINT nID = theApp.m_bLargeIcons ? 
  158.         IDR_SRVR_INPLACE_BIG : IDR_SRVR_INPLACE;
  159.     if (!m_wndToolBar.Create(pWndFrame, WS_CHILD|WS_VISIBLE|CBRS_TOP|
  160.             CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
  161.         !m_wndToolBar.LoadBitmap(nID) ||
  162.         !m_wndToolBar.SetButtons(toolButtons, 
  163.             sizeof(toolButtons)/sizeof(UINT) - nPen))
  164.     {
  165.         TRACE0("Failed to create toolbar\n");
  166.         return FALSE;      // fail to create
  167.     }
  168.     if (theApp.m_bLargeIcons)
  169.         m_wndToolBar.SetSizes(CSize(31,30), CSize(24,24));
  170.     else
  171.         m_wndToolBar.SetSizes(CSize(23,22), CSize(16,16));
  172.     CString str;
  173.     str.LoadString(IDS_TITLE_TOOLBAR);
  174.     m_wndToolBar.SetWindowText(str);
  175.     return TRUE;
  176. }
  177.  
  178. BOOL CInPlaceFrame::CreateFormatBar(CWnd* pWndFrame)
  179. {
  180.     ASSERT(m_wndFormatBar.m_hWnd == NULL);
  181.     m_wndFormatBar.m_hWndOwner = m_hWnd;
  182.     UINT nID = theApp.m_bLargeIcons ? IDB_FORMATBAR_BIG : IDB_FORMATBAR;
  183.     if (!m_wndFormatBar.Create(pWndFrame, WS_CHILD|WS_VISIBLE|CBRS_TOP|
  184.         CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_HIDE_INPLACE|CBRS_SIZE_DYNAMIC, ID_VIEW_FORMATBAR) ||
  185.         !m_wndFormatBar.LoadBitmap(nID) ||
  186.         !m_wndFormatBar.SetButtons(format, 
  187.             sizeof(format)/sizeof(UINT)))
  188.     {
  189.         TRACE0("Failed to create FormatBar\n");
  190.         return FALSE;      // fail to create
  191.     }
  192.  
  193.     if (theApp.m_bLargeIcons)
  194.         m_wndFormatBar.SetSizes(CSize(31,30), CSize(24,24));
  195.     else
  196.         m_wndFormatBar.SetSizes(CSize(23,22), CSize(16,16));
  197.     CString str;
  198.     str.LoadString(IDS_TITLE_FORMATBAR);
  199.     m_wndFormatBar.SetWindowText(str);
  200.     m_wndFormatBar.PositionCombos();
  201.     return TRUE;
  202. }
  203.  
  204. CInPlaceFrame::CreateRulerBar(CWnd* pWndFrame)
  205. {
  206.     if (!m_wndRulerBar.Create(pWndFrame, 
  207.         WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP|CBRS_HIDE_INPLACE, ID_VIEW_RULER))
  208.     {
  209.         TRACE0("Failed to create ruler\n");
  210.         return FALSE;      // fail to create
  211.     }
  212.     return TRUE;
  213. }
  214.  
  215. /////////////////////////////////////////////////////////////////////////////
  216. // CInPlaceFrame Operations
  217.  
  218. /////////////////////////////////////////////////////////////////////////////
  219. // CInPlaceFrame diagnostics
  220.  
  221. #ifdef _DEBUG
  222. void CInPlaceFrame::AssertValid() const
  223. {
  224.     COleIPFrameWnd::AssertValid();
  225. }
  226.  
  227. void CInPlaceFrame::Dump(CDumpContext& dc) const
  228. {
  229.     COleIPFrameWnd::Dump(dc);
  230. }
  231. #endif //_DEBUG
  232.  
  233. /////////////////////////////////////////////////////////////////////////////
  234. // CInPlaceFrame commands
  235.  
  236. void CInPlaceFrame::OnDestroy()
  237. {
  238.     m_wndToolBar.DestroyWindow();
  239.     m_wndFormatBar.DestroyWindow();
  240.     COleIPFrameWnd::OnDestroy();
  241. }
  242.  
  243. void CInPlaceFrame::RepositionFrame(LPCRECT lpPosRect, LPCRECT lpClipRect)
  244. {
  245.     CRect rectNew = lpPosRect;
  246.     rectNew.left -= HORZ_TEXTOFFSET;
  247.     rectNew.top -= VERT_TEXTOFFSET;
  248.     m_wndResizeBar.BringWindowToTop();
  249.     COleIPFrameWnd::RepositionFrame(&rectNew, lpClipRect);
  250.     CWnd* pWnd = GetActiveView();
  251.     if (pWnd != NULL)
  252.         pWnd->BringWindowToTop();
  253.     m_wndRulerBar.BringWindowToTop();
  254. }
  255.  
  256. void CInPlaceFrame::RecalcLayout(BOOL bNotify)
  257. {
  258.     if (m_wndResizeBar.m_hWnd != NULL)
  259.         m_wndResizeBar.BringWindowToTop();
  260.     COleIPFrameWnd::RecalcLayout(bNotify);
  261.     CWnd* pWnd = GetActiveView();
  262.     if (pWnd != NULL)
  263.         pWnd->BringWindowToTop();
  264.     if (m_wndRulerBar.m_hWnd != NULL)
  265.         m_wndRulerBar.BringWindowToTop();
  266.  
  267.     // at least 12 pt region plus ruler if it exists
  268.     CDisplayIC dc;
  269.     CSize size;
  270.     size.cy = MulDiv(12, dc.GetDeviceCaps(LOGPIXELSY), 72)+1;
  271.     size.cx = dc.GetDeviceCaps(LOGPIXELSX)/4; // 1/4"
  272.     size.cx += HORZ_TEXTOFFSET; //adjust for offset
  273.     size.cy += VERT_TEXTOFFSET;
  274.     if (m_wndRulerBar.m_hWnd != NULL && m_wndRulerBar.IsVisible())
  275.     {
  276.         CRect rect;
  277.         m_wndRulerBar.GetWindowRect(&rect);
  278.         size.cy += rect.Height();
  279.     }
  280.     m_wndResizeBar.SetMinSize(size);
  281. }
  282.  
  283. void CInPlaceFrame::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)
  284. {
  285.     COleIPFrameWnd::CalcWindowRect(lpClientRect, nAdjustType);
  286. }
  287.  
  288. LRESULT CInPlaceFrame::OnResizeChild(WPARAM /*wParam*/, LPARAM lParam)
  289. {
  290.     // notify the container that the rectangle has changed!
  291.     CWordPadDoc* pDoc = (CWordPadDoc*)GetActiveDocument();
  292.     if (pDoc == NULL)
  293.         return 0;
  294.  
  295.     ASSERT(pDoc->IsKindOf(RUNTIME_CLASS(CWordPadDoc)));
  296.  
  297.     // get new rect and parent
  298.     CRect rectNew;
  299.     rectNew.CopyRect((LPCRECT)lParam);
  300.     CWnd* pParentWnd = GetParent();
  301.     ASSERT_VALID(pParentWnd);
  302.  
  303.     // convert rectNew relative to pParentWnd
  304.     ClientToScreen(&rectNew);
  305.     pParentWnd->ScreenToClient(&rectNew);
  306.  
  307.     if (m_wndRulerBar.GetStyle()&WS_VISIBLE)
  308.     {
  309.         CRect rect;
  310.         m_wndRulerBar.GetWindowRect(&rect);
  311.         rectNew.top += rect.Height();
  312.     }
  313.     rectNew.left += HORZ_TEXTOFFSET;
  314.     rectNew.top += VERT_TEXTOFFSET;
  315.  
  316.     // adjust the new rectangle for the current control bars
  317.     CWnd* pLeftOver = GetDlgItem(AFX_IDW_PANE_FIRST);
  318.     ASSERT(pLeftOver != NULL);
  319.     CRect rectCur = m_rectPos;
  320.     pLeftOver->CalcWindowRect(&rectCur, CWnd::adjustOutside);
  321.     rectNew.left += m_rectPos.left - rectCur.left;
  322.     rectNew.top += m_rectPos.top - rectCur.top;
  323.     rectNew.right -= rectCur.right - m_rectPos.right;
  324.     rectNew.bottom -= rectCur.bottom - m_rectPos.bottom;
  325.     OnRequestPositionChange(rectNew);
  326.  
  327.     return 0;
  328. }
  329.  
  330. LONG CInPlaceFrame::OnBarState(UINT wParam, LONG lParam)
  331. {
  332.     if (lParam == -1)
  333.         return 0L;
  334.     if (wParam == 0)
  335.     {
  336.         GetDockState(theApp.GetDockState(RD_EMBEDDED));
  337.         ASSERT(m_pMainFrame != NULL);
  338.         m_pMainFrame->GetDockState(theApp.GetDockState(RD_EMBEDDED, FALSE));
  339.     }
  340.     else
  341.     {
  342.         SetDockState(theApp.GetDockState(RD_EMBEDDED));
  343.         m_pMainFrame->SetDockState(theApp.GetDockState(RD_EMBEDDED, FALSE));
  344.     }
  345.     return 0L;
  346. }
  347.  
  348. void CInPlaceFrame::OnHelpFinder() 
  349. {
  350.     theApp.WinHelp(0, HELP_FINDER);
  351. }
  352.  
  353. void CInPlaceFrame::OnCharColor() 
  354. {
  355.     CColorMenu colorMenu;
  356.     CRect rc;
  357.     int index = m_wndFormatBar.CommandToIndex(ID_CHAR_COLOR);
  358.     m_wndFormatBar.GetItemRect(index, &rc);
  359.     m_wndFormatBar.ClientToScreen(rc);
  360.     colorMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,rc.left,rc.bottom, this);
  361. }
  362.  
  363. void CInPlaceFrame::OnPenToggle() 
  364. {
  365.     static int nPen = 0;
  366.     m_wndToolBar.SetButtons(toolButtons, sizeof(toolButtons)/sizeof(UINT) - nPen);
  367.     nPen = (nPen == 0) ? NUM_PEN_TOGGLE : 0;
  368.     m_wndToolBar.Invalidate();
  369.     m_wndToolBar.GetParentFrame()->RecalcLayout();
  370. }
  371.